package web.tcc.ifrn.janine.managedBeans;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import projeto.tcc.ifrn.central.janine.facades.ClienteFacade;
import projeto.tcc.ifrn.central.janine.facades.PedidoFacade;
import projeto.tcc.ifrn.central.janine.model.Cliente;
import projeto.tcc.ifrn.central.janine.model.Ingresso;
import projeto.tcc.ifrn.central.janine.model.ItemPedido;
import projeto.tcc.ifrn.central.janine.model.Pedido;
import web.tcc.ifrn.janine.utilitarios.ContextoUtil;
import br.com.uol.pagseguro.domain.AccountCredentials;
import br.com.uol.pagseguro.domain.PaymentRequest;
import br.com.uol.pagseguro.enums.Currency;
import br.com.uol.pagseguro.exception.PagSeguroServiceException;

@ManagedBean
@SessionScoped
public class CarrinhoDeCompras {

	private int qtd = 1;
	private List<ItemPedido> itensPedido = new ArrayList<ItemPedido>();
	private Ingresso ingresso = null;
	private ItemPedido itemPedido = new ItemPedido();
	@EJB
	ClienteFacade clienteFacade;
	@EJB
	PedidoFacade pedidoFacade;

	public ItemPedido getItemPedido() {
		return itemPedido;
	}

	public void setItemPedido(ItemPedido itemPedido) {
		this.itemPedido = itemPedido;
	}

	public Ingresso getIngresso() {
		return ingresso;
	}

	public void setIngresso(Ingresso ingresso) {
		this.ingresso = ingresso;
	}

	public int getQtd() {
		return qtd;
	}

	public void setQtd(int qtd) {
		this.qtd = qtd;
	}

	public List<ItemPedido> getItensPedido() {
		return itensPedido;
	}

	public void setItensPedido(List<ItemPedido> itensPedido) {
		this.itensPedido = itensPedido;
	}

	public String adiciona() {

		ItemPedido itemPedido = new ItemPedido();
		itemPedido.setQtd(qtd);
		itemPedido.setIngresso(ingresso);

		itemPedido.setPrecoUnitario(ingresso.getPreco());
		BigDecimal quantidade = BigDecimal.valueOf(qtd);
		itemPedido.setPrecoTotal((ingresso.getPreco()).multiply(quantidade));

		itensPedido.add(itemPedido);
		return null;

	}

	public String remove() {
		this.itensPedido.remove(itemPedido);
		return null;
	}

	public String comprar() {
		PaymentRequest paymentRequest = new PaymentRequest();

		if (itensPedido.isEmpty()) {
			FacesContext context = FacesContext.getCurrentInstance();
			context.addMessage(null, new FacesMessage(
					"Nenhum Item no carrinho de Compras"));
			return null;
		}

		ContextoBean contextoBean = ContextoUtil.getContextBean();
		Cliente cliente = clienteFacade.buscaPorLogin(contextoBean
				.getUsuarioLogado());

		Date date = new Date();
		Pedido pedido = new Pedido();
		pedido.setItensPedido(itensPedido);
		pedido.setDataPedido(date);
		pedido.setStatus("WAITING_PAYMENT");
		pedido.setValorTotal(this.valorPedido());
		pedido.setCliente(cliente);
		pedido.setEvento(ingresso.getEvento());

		for (ItemPedido itemPedido : itensPedido) {

			paymentRequest.addItem(String.valueOf(itemPedido.getId()),
					itemPedido.getIngresso().getDescricao(),
					itemPedido.getQtd(), itemPedido.getPrecoUnitario(), null,
					null);
		}

		try {
			pedidoFacade.salvarPedido(pedido);
			paymentRequest.setReference("REF" + pedido.getId());
			pedido.setRef("REF" + pedido.getId());
			pedidoFacade.atualizar(pedido);
			paymentRequest.setCurrency(Currency.BRL);

			boolean onlyCheckoutCode = false;
			String response = paymentRequest.register(new AccountCredentials(
					"janjan_ramos@hotmail.com",
					"4323DBB943D84C168A8E445E01CAB006"), onlyCheckoutCode);

			System.out.println("url pagseguro" + response);

			itemPedido = null;
			pedido = null;
			itensPedido = null;
			ingresso = null;
			qtd = 0;
			FacesContext.getCurrentInstance().getExternalContext()
					.redirect(response);

		} catch (PagSeguroServiceException e) {

			System.err.println(e.getMessage());
		} catch (IOException e) {
			// TODO: handle exception
			System.err.println(e.getMessage());
		}
		return "redirecionamento";
	}

	private BigDecimal valorPedido() {
		BigDecimal valortotal = new BigDecimal(0);
		for (ItemPedido itemPedido : itensPedido) {
			valortotal = valortotal.add(itemPedido.getPrecoTotal());
		}
		return valortotal;
	}
}
